Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 03.03.2014, 16:44
Интересующийся
Отправить личное сообщение для arkhipovandrei Посмотреть профиль Найти все сообщения от arkhipovandrei
 
Регистрация: 03.03.2014
Сообщений: 10

данные из $.post
у меня вопрос связан с тем что бы понять почему именно так, а не иначе

Конструкция:
var unitList = '';
function getUnit() {
    $.post('/admin/kit/getUnits', function(data) {
        unitList = data;
        console.log(unitList);
    });
}

возвращает данные и приравнивает результат запроса глобальной переменной unitList если она находится за пределами $(document).ready и доступен в нем, но если эта же конструкция лежит внутри $(document).ready значение в unitList не обновляются.

Собственно вопрос :
разве переменная var unitList = ''; не должна быль глобальной для блока $(document).ready и всех методов и событий обернутых в этот блог.
Ответить с цитированием
  #2 (permalink)  
Старый 03.03.2014, 16:53
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,277

Сообщение от arkhipovandrei
разве переменная var unitList = ''; не должна быль глобальной для блока $(document).ready и всех методов и событий обернутых в этот блог.
Бивас, тест! (с)

<!DOCTYPE html>
<html>
<head>
<script src='http://code.jquery.com/jquery-latest.js'></script>
<!--
<link rel='stylesheet type=text/css href=tmp.css' />
-->
<style type='text/css'>
</style>
<script type='text/javascript'>
var test=0;
$(function (){
	test=1;
});
</script>
</head>
<body>
<button onclick='alert(test);'>test</button>
</body>
</html>

Таки все работает!
Ответить с цитированием
  #3 (permalink)  
Старый 03.03.2014, 16:56
Интересующийся
Отправить личное сообщение для arkhipovandrei Посмотреть профиль Найти все сообщения от arkhipovandrei
 
Регистрация: 03.03.2014
Сообщений: 10

да с обычными переменными проблем не возникает, тут именно не понимаю почему данные полученные $.ajax не кладутся в переменную
Ответить с цитированием
  #4 (permalink)  
Старый 03.03.2014, 18:51
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Не забыл что запрос то асинхронный? Соответсвенно переменная изменится через несколько милисекунд после отправки запроса.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #5 (permalink)  
Старый 03.03.2014, 19:12
Интересующийся
Отправить личное сообщение для arkhipovandrei Посмотреть профиль Найти все сообщения от arkhipovandrei
 
Регистрация: 03.03.2014
Сообщений: 10

те в момент работы запроса он равен значению из $.post, а по завершению принимает исходное значение?
ps. просто я пытаюсь понять как это работает
Ответить с цитированием
  #6 (permalink)  
Старый 03.03.2014, 20:18
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от arkhipovandrei
в момент работы запроса он равен значению из $.post
Как такое может быть? Как он может принять значение, которого еще нет (ответ от сервера то еще не пришел) ?

Ты вместо unitList = '' напиши unitList = 'Еще не загружено' и посмотри че твой скрипт выведет. И вобще, не проще показать свой код?
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #7 (permalink)  
Старый 03.03.2014, 20:27
Интересующийся
Отправить личное сообщение для arkhipovandrei Посмотреть профиль Найти все сообщения от arkhipovandrei
 
Регистрация: 03.03.2014
Сообщений: 10

var global = "need change";
  $(document).ready(function() {
      var posting= $.post('/lession_global/getters.php');
      
      function usePostData() {
	posting.done( function(data) { 
		global = data;
		console.log(global) // вот тут global равен json объекту возвращаемому ajax-ом 

	});
    }

    usePostData();
    console.log(global) // а тут global равен  "need change" как будто бы ajax-a никогда и не было;

});


конечно можно было бы не парится и как обычно написать
$.post(url,data,function(data) {
   // или вместо этой функции написать ф-ию которая отвечает за рендр 
  // но что если вдруг нужно будет повторно использовать значения хранимые в data ? 
  // логичнее было бы 1 раз получить значение и использовать сколь угодно раз в пределах 1 блока document.ready 
});

Последний раз редактировалось arkhipovandrei, 03.03.2014 в 20:32.
Ответить с цитированием
  #8 (permalink)  
Старый 03.03.2014, 20:48
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Сообщение от arkhipovandrei
    console.log(global) // а тут global равен  "need change" как будто бы ajax-a никогда и не было;
Так его и небыло ))) Он только-только начался. Я же говорю - HTTP-запрос происходит втечение нескольких десятков или сотен милисекунд.
И даже если бы запрос произошел моментально, то все равно, из-за асинхронной его природы функция-обработчик (переданная аргументом в .done) будет исполнена только после завершения исполнения текущего скрипта.
__________________
В личку только с интересными предложениями
Ответить с цитированием
  #9 (permalink)  
Старый 04.03.2014, 09:05
Интересующийся
Отправить личное сообщение для arkhipovandrei Посмотреть профиль Найти все сообщения от arkhipovandrei
 
Регистрация: 03.03.2014
Сообщений: 10

хорошо тогда более конкретный вопрос, как сделать так что бы по окончанию данного кода в дивке.appendPlace появилась вся эта разметка (те что бы в нем по мимо дивки был еще и select с единицами измерения );
можно конечно сбор всего htmlTemplate положит в $.post(url,data,fun() {// сюда, и тут же сделать аппенд }), но хотелось бы что бы разметка шаблона лежала в 1 месте, а данные которые возвращаются асинхронно лежали в др месте, но если я все понял правильно из-за своей асинхронности данные меняются на протяжении всего момента связи сервером и как только вернется последний байт выполняется событие .done в котором все еще доступны данные, а потом все память освобождается ;


я все правильно понимаю? или все же можно эти данные как то сложить в переменную и повторно потом использовать или нет?

htmlTemplate  = '<div class="col-n2">';
                $.post('/admin/kit/getUnits',function(data) {
                    if(!empty(data)) {
                        htmlTemplate += '<label>Еденица измерения:</label>';
                        htmlTemplate += '<select name="unit">';

                        $.each(data, function(index, unitListValue) {
                            console.log("\n",unitListValue);
                                htmlTemplate += '<option value="' + index +'">' + unitListValue +'</option>'
                       });

                        htmlTemplate += '</select>';
                    }
                    return htmlTemplate;
                });
htmlTemplate += '</div>';

 if (htmlTemplate.length && appendPlace.length) {
      appendPlace.html(htmlTemplate);
 }

Последний раз редактировалось arkhipovandrei, 04.03.2014 в 09:19.
Ответить с цитированием
  #10 (permalink)  
Старый 04.03.2014, 09:19
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,277

Сообщение от arkhipovandrei
или все же можно эти данные как то сложить в переменную и повторно потом использовать
Если это нечто есть примитив - его всегда можно присвоить другой (как вариант, глобальной) переменной. И даже если оригинал исчезнет - копия останется.
Если данные не примитив - в "копию" передается только ссылка... И когда "оригтнала" нестанет проку от той ссылки так же не будет...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ajax $.post вместо json проблема данные не приходят Sadist_dead AJAX и COMET 2 12.07.2012 17:59
считать данные с url Amfoterra AJAX и COMET 2 07.05.2012 07:10
Как подгрузить данные с чужого домена, XSS-proof? Actine AJAX и COMET 6 03.09.2011 22:08
WYMeditor: не отправляются данные на сервер Ticksy jQuery 0 04.01.2011 21:45
Не совсем обычный фрейм и выезжающий текст при наводе на картинку. amaz245 Элементы интерфейса 35 25.12.2010 17:29